home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
UNIXLIB37B
/
!UnixLib37
/
src
/
unix
/
c
/
fcntl
< prev
next >
Wrap
Text File
|
1996-11-09
|
2KB
|
97 lines
/****************************************************************************
*
* $Source: /unixb/home/unixlib/source/unixlib37/src/unix/c/RCS/fcntl,v $
* $Date: 1996/10/30 21:59:01 $
* $Revision: 1.2 $
* $State: Rel $
* $Author: unixlib $
*
* $Log: fcntl,v $
* Revision 1.2 1996/10/30 21:59:01 unixlib
* Massive changes made by Nick Burret and Peter Burwood.
*
* Revision 1.1 1996/04/19 21:35:27 simon
* Initial revision
*
***************************************************************************/
static const char rcs_id[] = "$Id: fcntl,v 1.2 1996/10/30 21:59:01 unixlib Rel $";
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/unix.h>
int
fcntl (int fd, int cmd, ...)
{
va_list ap;
register struct file *f;
int arg;
va_start (ap, cmd);
if (BADF (fd))
{
errno = EBADF;
va_end (ap);
return (-1);
}
f = __u->file + fd;
switch (cmd)
{
case F_DUPFD:
{
register struct file *_f;
arg = va_arg (ap, int);
_f = __u->file + arg;
while (arg < MAXFD && _f->dup)
arg++, _f++;
if (arg >= MAXFD)
{
errno = EMFILE;
va_end (ap);
return (-1);
}
}
va_end (ap);
return (dup2 (fd, arg));
break;
case F_GETFD:
va_end (ap);
return ((f->oflag & O_EXECCL) ? 1 : 0);
break;
case F_SETFD:
arg = va_arg (ap, int);
f->oflag = (f->oflag & (~O_EXECCL)) | \
((arg & 1) ? O_EXECCL : 0);
va_end (ap);
return (0);
break;
case F_GETFL:
va_end (ap);
return (f->oflag);
break;
case F_SETFL:
arg = va_arg (ap, int);
f->oflag = (f->oflag & ~(O_APPEND | O_NDELAY)) | \
(arg & (O_APPEND | O_NDELAY));
va_end (ap);
return (0);
break;
default:
errno = EINVAL;
va_end (ap);
return (-1);
break;
}
va_end (ap);
return -1;
}